//#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//void bub(int arr[], int sz)
//{
//	int i = 0, j = 0;
//	int flag = 1;
//	int temp = 0;
//	for (i = 0; i < sz; i++)
//	{
//		for (j = 0; j < sz - 1 - i; j++)
//		{
//			if (arr[j] > arr[j + 1]) {
//				temp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = temp;
//				flag = 0;
//			}
//		}
//		if (flag == 1)
//			break;
//	}
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//int main()
//{
//	int arr[] = { 0,1,2,3,4,5,8,9,7,6 };
//	int i = 0, j = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (i = 0; i < sz; i++)
//	{
//		scanf("%d", &arr[i]);
//	}
//	bub(arr, sz);
//}
//
//#include<stdio.h>
//int cmp(const void* e1, const void* e2)
//{
//	return (*(int*)e1 - *(int*)e2);
//}
//int main()
//{
//	int arr[] = { 2,1,3,0,4,8,5,7,6,9 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(arr[0]), cmp);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]); 
//	}
//}
//
#include<stdio.h>
int cmp(void* e1, void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
void swap(void* e1, void* e2, int size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char tmp = *((char*)e1 + i);
		*((char*)e1 + i) = *((char*)e2 + i);
		*((char*)e2 + i) = tmp;
	}
}
void bubble(void* base, int sz, int size, int(*cmp)(void*, void*))
{
	int i = 0, j = 0;
	int flag = 1;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++) 
		{
			if (cmp((char*)base + size * j, (char*)base + size * (j+1)) > 0)
				swap((char*)base + size * j, (char*)base + size * (j+1), size);
			flag = 0;
		}
		if (flag ==1)
			break;
	}

}
int main()
{
	int arr[] = { 3,5,6,9,4,1,0,7,8,2 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble(arr, sz, sizeof(arr[0]), cmp);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
//}
//
//
//#include<stdio.h>
//#include<stdlib.h>
//struct stu
//{
//	char name[30];
//	int age;
//};
//int cmp(void* e1, void* e2)
//{
//	strcmp (((struct stu*)e1)->name , ((struct stu*)e2)->name);
//}
//int main()
//{
//	struct stu s[] = { {"zhangsan",15},{"lisi",30},{"wangwu",25} };
//	int sz = sizeof(s) / sizeof(s[0]);
//	qsort(s, sz, sizeof(s[0]), cmp);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%s ",  s[i].name);
//	}
//}

